package com.leco.demo.base;

import java.lang.ref.SoftReference;

/**
 * @author greg
 * @version 2022/9/9
 * 关于引用
 * jvm参数: -Xms20m -Xmx20m
 **/
public class ReferenceDemo {
    public static void main(String[] args) {
        demo4();
    }

    /**
     * 一个10m的软引用对象，一个10m的强引用对象，软引用对象会被回收掉
     */
    private static void demo1() {
        SoftReference<byte[]> sr = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(sr.get());
        System.out.println("====");
        byte[] b = new byte[1024 * 1024 * 10];
        System.out.println(sr.get());
        System.out.println(b);
    }

    /**
     * 两个10m的软引用对象，第一个软引用对象会被回收掉
     */
    private static void demo2() {
        SoftReference<byte[]> sr = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(sr.get());
        System.out.println("====");
        SoftReference<byte[]> sr2 = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(sr.get());
        System.out.println(sr2.get());
    }

    /**
     * 两个10m的强引用对象，第二个会oom
     */
    private static void demo3() {
        byte[] b = new byte[1024 * 1024 * 10];
        System.out.println(b);
        System.out.println("====");
        byte[] b2 = new byte[1024 * 1024 * 10];
        System.out.println(b);
        System.out.println(b2);
    }

    /**
     * 两个10m的强引用对象，第一个引用置空，第二个可以创建出来(第一个对象被回收了)
     */
    private static void demo4() {
        byte[] b = new byte[1024 * 1024 * 10];
        System.out.println(b);
        System.out.println("====");
        b = null;
        byte[] b2 = new byte[1024 * 1024 * 10];
        System.out.println(b);
        System.out.println(b2);
    }
}
